/*
按键扫描
KEY_Loop 10ms
*/
#include "polsys.h"
#include "key.h"

static pdata u16 mDxd=0;
static pdata u16 mUxd=0xFFFF;		// 消抖计时变量
static pdata u8 mClickCount=0;  // 点击次数
static pdata polsys_task_t mTask;
static pdata key_event_notify_t mNotify = NULL;
static bit mIsDown = false;

//10ms执行一次
void KEY_Loop()	
{
    if(!KEY_PIN)
    {
        if(mDxd==2)  //按下时间达到20ms
        {
            mIsDown = true;
            if(mNotify!=NULL)mNotify(KEY_EVENT_DOWN);
            mUxd = 0;
        }
        if(mDxd == 300)     //按下的时间达到3s
        {
            if(mNotify!=NULL)mNotify(KEY_EVENT_LONG_PRESS);
        }
        if(mDxd == 800)    //按下的时间达到8s
        {
            if(mNotify!=NULL)mNotify(KEY_EVENT_LONG_LONG_PRESS);
        }
        if(mDxd<0xFFFF)mDxd++;
    }
    else
    {
        if(mUxd == 2)   //松手的时间达到20ms执行一次
        {
            mIsDown = false;
            if(mNotify!=NULL)mNotify(KEY_EVENT_UP);     // 通知松手事件
            if(mDxd<36)    // 如果按下的时间在0ms~360ms之间，认为是短按
            {
                //if(mNotify!=NULL)mNotify(KEY_EVENT_CLICK);  // 通知单击事件
                mClickCount++;
                if(mClickCount == 5)
                    if(mNotify!=NULL)mNotify(KEY_EVENT_5_CLICK);
            }
            //else
            //{
                /* 长按松手事件 */
            //}
            mDxd = 0;   // 清零按下计时
        }
        else if(mUxd == 36) // 松手的时间达到360ms
        {
            if(mClickCount<5&&mClickCount>1)
                if(mNotify!=NULL)mNotify(KEY_EVENT_CLICK-1+mClickCount);
            mClickCount = 0;
        }
        if(mUxd<0xFFFF)mUxd++;
    }
    //如果单独线程在此处加入Sleep(10);
}


void KEY_Init(key_event_notify_t notify)
{
    mNotify = notify;

    Polsys_TaskInit(&mTask,KEY_Loop,10);
}

FORCE_IN_LINE bool KEY_IsDown()
{
    return mIsDown;
}


